/* Copyright 203-2115 AtomWare Technology Pty Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * The flowing information must be keep 
 * DownloadInterceptor.java
 * jackysoft-basic-core
 * 2012-12-17上午10:09:45
 * @author 屈甲康
 * QQ285799123
 * mailto:qujiakang@gmail.com
 */

package org.jackysoft.interceptor;

import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.poi.util.IOUtils;
import org.jackysoft.annotations.ActionRequestMethod;
import org.jackysoft.annotations.MethodInceptor;
import org.jackysoft.util.FileDownload;
import org.springframework.web.servlet.ModelAndView;

@MethodInceptor(method = ActionRequestMethod.download)
public class DownloadInterceptor extends AbstractInterceptor {

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {

		Method service_m_gets = service.getClass().getMethod("download",
				String.class);

		Object idval = PropertyUtils.getProperty(bean, "id");

		FileDownload fileInfo = (FileDownload) service_m_gets.invoke(service,
				idval.toString());
		response.setContentType(fileInfo.getMime());
		response.setHeader("Content-disposition", "attachment; filename="
				+ fileInfo.getTitle() + "." + fileInfo.getFileType());
		OutputStream os = response.getOutputStream();
		InputStream ins = fileInfo.getInputStream();
		IOUtils.copy(ins, os);
		response.setContentLength(ins.available());
	}
}
